這次拿來當示範的文章,是「報導者-【普悠瑪18死事故】2通簡訊示警,關鍵53分鐘危機處理待調查」。唉這起事故讓小馬接著幾天的心情都不太好,這篇報導以今天來看當然略顯過時,但它是我認為一篇,在事發隔天就快速把關鍵重點收集起來,並且條理分明邏輯清楚的好文章。
資料匯入後的長相是這樣:
看上去也是蠻雜亂的,再次提醒這邊要留意的關鍵,在於所有要被你拿來做文字雲的文字,必須統一放在target這個欄位裡,後續才處理得到。當然啦......如果一不小心匯入變成好幾個欄位,就把這幾個欄位黏起來命名成target,也無可厚非,也是可以拿來繼續處理的,這都算清洗的範疇內。
DROP TABLE IF EXISTS ithelp_wordcloudmand_t1_source;
CREATE TABLE ithelp_wordcloudmand_t1_source as
select TRANSLATE(
target,'//,。、,;;::()()「」【】??~!!<>.《》''',' ')
||' END' target
from ithelp_text_mand_source
;
select * from ithelp_wordcloudmand_t1_source
因為兩天前處理英文文字雲時有詳細說明,這邊當作複習,將會比較快速的帶過。
上面的步驟,一樣是利用TRANSLATE()將所有的標點符號,替換成半形空格。中文文章裡面出現英文的機會比較低,上面SQL沒有加上lower(),要不要加,端看處裡的文章內容而訂,你也可以補上去。最後一樣加了' END'
,你想加' LOVE'
或任何一個最前面帶有空格的中英文字,都可以,只是為了讓最後一句話也能被收進去。
處理後,你會發現所有的編點符號,都被取代成了半形空格,
資料長度較短的也會直接看到我加上去的' END'
標記:
DROP TABLE IF EXISTS ithelp_wordcloudmand_t2_processing;
CREATE TABLE ithelp_wordcloudmand_t2_processing as
select *,
STRPOS(target,' ') tag,
LEFT(target,STRPOS(target,' ')-1) goal,
SUBSTRING(target,STRPOS(target,' ')+1) next_target
from ithelp_wordcloudmand_t1_source
;
select * from ithelp_wordcloudmand_t2_processing
和英文文字雲相同的步驟2,找到半形空格位置,命名為tag,之後要做控制項;將第一句話切成goal,準備拿去收納;將第二句話往後的全部文字,切成next_target,準備繼續處理。
在這次的實際範例裡,就會處理如下:
DROP TABLE IF EXISTS ithelp_wordcloudmand_t3_goalwarehouse;
CREATE TABLE ithelp_wordcloudmand_t3_goalwarehouse as
select goal
from ithelp_wordcloudmand_t2_processing
where goal is not null and goal not in ('') and tag > 0
;
select * from ithelp_wordcloudmand_t3_goalwarehouse
和英文文字雲相同的步驟3,建出goal的倉庫(goal-warehouse),這次只會把第一次跑出來的goal給放進去。步驟裡一樣限定了:收進goal-warehouse的單字必須不是null、必須不是空白、必須tag>0。
--t1
DROP TABLE IF EXISTS ithelp_wordcloudmand_t1_source;
CREATE TABLE ithelp_wordcloudmand_t1_source as
select next_target target
from ithelp_wordcloudmand_t2_processing
;
--t2
DROP TABLE IF EXISTS ithelp_wordcloudmand_t2_processing;
CREATE TABLE ithelp_wordcloudmand_t2_processing as
select *,
STRPOS(target,' ') tag,
LEFT(target,STRPOS(target,' ')-1) goal,
SUBSTRING(target,STRPOS(target,' ')+1) next_target
from ithelp_wordcloudmand_t1_source
;
--t3
INSERT into ithelp_wordcloudmand_t3_goalwarehouse
select goal
from ithelp_wordcloudmand_t2_processing
where goal is not null and goal not in ('') and tag > 0;
再次很快提醒上面的差異:
t1第一次是從source去建,第二次開始是拿t2來重建t1。
t2第一次與後面每一次,做的事情都一模一樣。
t3第一次是create table,第二次開始是insert into。
先記著,這等下要丟進迴圈裡面去跑,但在建置迴圈前,我們必須先去建好控制項。
DROP FUNCTION IF EXISTS ithelp_wordcloudmand_1();
CREATE OR REPLACE FUNCTION ithelp_wordcloudmand_1()
RETURNS INTEGER as
$BODY$
BEGIN
RETURN tag
from (
select MAX(tag) over (PARTITION BY 1) tag
from ithelp_wordcloudmand_t2_processing
) A
group by tag
;
END
$BODY$
LANGUAGE 'plpgsql';
和英文文字雲相同的步驟4,要讓迴圈執行到每一列(每一筆資料)的tag都歸0為止,可以想像只要有某一筆資料tag還不是0,整個function return出來的整數就還不是0。當ithelp_wordcloud_1() > 0 的時候執行迴圈,在等下會放進迴圈的控制項位置。
----------以下開始ithelp_wordcloudmand_2的設定----------
DROP FUNCTION IF EXISTS ithelp_wordcloudmand_2();
CREATE OR REPLACE FUNCTION ithelp_wordcloudmand_2() RETURNS void as
$BODY$
BEGIN
----------以下開始【控制項】設定----------
WHILE ithelp_wordcloudmand_1() > 0
----------以上結束【控制項】設定----------
----------以下開始【迴圈內容】設定----------
LOOP
--t1
DROP TABLE IF EXISTS ithelp_wordcloudmand_t1_source;
CREATE TABLE ithelp_wordcloudmand_t1_source as
select next_target target
from ithelp_wordcloudmand_t2_processing
;
--t2
DROP TABLE IF EXISTS ithelp_wordcloudmand_t2_processing;
CREATE TABLE ithelp_wordcloudmand_t2_processing as
select *,
STRPOS(target,' ') tag,
LEFT(target,STRPOS(target,' ')-1) goal,
SUBSTRING(target,STRPOS(target,' ')+1) next_target
from ithelp_wordcloudmand_t1_source
;
--t3
INSERT into ithelp_wordcloudmand_t3_goalwarehouse
select goal
from ithelp_wordcloudmand_t2_processing
where goal is not null and goal not in ('') and tag > 0;
END LOOP
----------以上結束【迴圈內容】設定----------
;
END
$BODY$
LANGUAGE 'plpgsql';
----------以上結束ithelp_wordcloudmand_2的設定----------
和英文文字雲相同的步驟5,留意三個區塊即可:
1.目的是執行,因此不返回任何東西:
RETURNS void
2.控制項放的位置
3.要執行三個重複步驟t1~t3放的位置
最後,記得實際去執行這個function,然後把成果(goal-warehouse)叫出來看看。
select ithelp_wordcloudmand_2();
select * from ithelp_wordcloudmand_t3_goalwarehouse
這時候存放於t3_goalwarehouse裡面的,已經是利用標點符號拆開成的單字或句子(在原始文章內,中間沒有標點符號也沒有被切開成段落的單字或句子)。
在英文,這步做完已經是每個單字,在中文,只是把句子拆開而已。
共有412筆資料,如Excel檔案(.xlsx)。
外迴圈的實例說明至這篇文章為止,已完全結束,明天會利用內迴圈,把剩下來的工作處理完。
事實上,外迴圈的概念就是一套完整的AI建置過程:
將大量的資料,不斷地送給設計好的迴圈循環,讓所謂AI,不斷訓練、不斷學習、不斷累積AI所擁有的經驗與知識,重點是:AI還不會覺得累!
透過上述流程我們也可以發現,AI要如何去學習、學到什麼地步才是「學成出師」,仍舊看人類對於「學成出師」的定義是什麼。就像是,當我們用了英文為範例,AI走完上面五堂學習課程,就已經把單字給處理完,但換成中文,卻仍只是個四不像的半成品。
這中間難道有辦法發展成,讓AI自行判斷自己「學成出師」了沒,厲害到AI自己知道念英文只要念五堂,念中文要念八堂?以小馬經驗至今,我認為這還是很遙遠的目標,現在的AI,背後仍舊是滿滿的人工判斷。然而小馬認為這無可厚非,畢竟它就是「人工」「智慧」嘛,而不是「外星生物」啊!
這也是我最近跟同行聊到AI很常說的話:
你那個不叫AI,你那個叫外星人,人類是製造不出外星人的。
上一篇:
SQL迴圈實作 -8.中文文字雲的處理工廠1
下一篇:
SQL迴圈實作 -10.中文文字雲的處理工廠3